//// Project name:JavaRedis
//// Creator:muhong
//// Date time:2022/11/25,10:19 下午
//// Name:WorkThreadPool
//
//package org.gmh.server;
//
//import org.gmh.channel.handler.ChannelPipeline;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.IOException;
//import java.nio.channels.SelectionKey;
//import java.nio.channels.Selector;
//import java.nio.channels.SocketChannel;
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Set;
//import java.util.concurrent.ExecutionException;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.Future;
//
//public class WorkEventLoopGroup extends Thread {
//    private final Logger logger = LoggerFactory.getLogger(this.getClass());
//
//    ExecutorService executorService = Executors.newFixedThreadPool(10);
//
//    boolean isShutDown = false;
//
//    Selector selector;
//
//    WorkEventLoopGroup() {
//        init();
//    }
//
//    public void init() {
//        try {
//            selector = Selector.open();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//
//    @Override
//    public void run() {
//        super.run();
//
//        int defaultSelectTimeout = 1000;
//        // 迂回实现
//        List<Future<SocketEventTaskResult>> asyncTaskList = new ArrayList<>();
//        //
//        for (; ; ) {
//            if (isShutDown) {
//                break;
//            }
//            asyncTaskList.clear();
//            try {
//                logger.info("start to check socket event");
//                selector.select(defaultSelectTimeout);
//                Set<SelectionKey> keySet = selector.selectedKeys();
//                Iterator<SelectionKey> iterator = keySet.iterator();
//                while (iterator.hasNext()) {
//                    SelectionKey key = iterator.next();
//                    iterator.remove();
//                    SocketEventTask eventTask = new SocketEventTask(key);
//                    Future f = executorService.submit(eventTask);
//                    asyncTaskList.add(f);
//                }
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//
//            // 等待所有异步任务完成
//            for (Future<SocketEventTaskResult> future : asyncTaskList) {
//                SocketEventTaskResult result;
//                try {
//                    result = (SocketEventTaskResult) future.get();
//                    // 注意关闭
//                    if (result.result == -1) {
//                        logger.info("task execute result:" + result.result);
//                        SelectionKey key = result.key;
//                        result.key.cancel();
//                        try {
//                            key.channel().close();
//                        } catch (IOException ex) {
//                            ex.printStackTrace();
//                        }
//                    }
//
//                } catch (InterruptedException | ExecutionException e) {
//                    e.printStackTrace();
//                }
//
//            }
//        }
//
//    }
//
//
//    public boolean register(SocketChannel socketChannel) {
//        logger.info("register socket on sub reactor -- start");
//        ChannelPipeline pipeline = new ChannelPipeline();
//        pipeline.addLast(new EchoChannelHandler());
//        OldNioSocketChannel oldNioSocketChannel = new OldNioSocketChannel(socketChannel, pipeline);
//        try {
//            socketChannel.configureBlocking(false);
//            SelectionKey clientKey = socketChannel.register(selector, SelectionKey.OP_READ);
//            clientKey.attach(oldNioSocketChannel);
//            selector.wakeup();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        logger.info("register socket on sub reactor -- end");
//        return true;
//    }
//
//    public void setShutDown(boolean shutDown) {
//        isShutDown = shutDown;
//    }
//}
